package pseudoAssemblerCompiler.twopassassembler.view.secondpass;

import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.TableViewerColumn;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.FormAttachment;
import org.eclipse.swt.layout.FormData;
import org.eclipse.swt.layout.FormLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.TableColumn;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import pseudoAssemblerCompiler.twopassassembler.model.referencetable.ReferenceTableContentProvider;
import pseudoAssemblerCompiler.twopassassembler.model.referencetable.ReferenceTableLabelProvider;
import pseudoAssemblerCompiler.twopassassembler.view.common.IView;
import pseudoAssemblerCompiler.twopassassembler.view.util.TableViewerContainer;

import java.util.List;

/**
 * Вспомогатльная таблица
 *
 * @author Чекашов Р. И.
 */
public class ReferenceTable implements IView, IReferenceTableView {

    private static final Logger LOGGER =
            LoggerFactory.getLogger(ReferenceTable.class);

    /**
     * Название таблицы
     */
    private static final String TABLE_NAME = "Вспомогатльная таблица";

    /**
     * Основной контейнер представления второго прохода
     */
    private Composite _composite;

    private TableViewerContainer container;

    /**
     * Таблица кодов операций
     */
    private TableViewer _referenceTableViewer;

    /**
     * Адрес
     */
    private TableColumn _addressColumn;

    /**
     * Код команды
     */
    private TableColumn _instructionCodeColumn;

    /**
     * Операнд
     */
    private TableColumn _operandColumn;

    /**
     * Метка
     */
    private Label _label;

    public ReferenceTable(Composite aParent) {
        _composite = new Composite(aParent, SWT.NONE);

        _label = new Label(_composite, SWT.CENTER);
        _label.setText(TABLE_NAME);

        container = new TableViewerContainer(_composite);
        _referenceTableViewer = container.get_tableViewer();
        _referenceTableViewer.getTable().setHeaderVisible(true);
        _referenceTableViewer.getTable().setLinesVisible(true);

        TableViewerColumn addressTVC1 = container.createColumn("Адрес");
        TableViewerColumn instructionCodeTVC2 = container.createColumn("Код команды");
        TableViewerColumn operandTVC3 = container.createColumn("Операнд");

        _addressColumn = addressTVC1.getColumn();
        _instructionCodeColumn = instructionCodeTVC2.getColumn();
        _operandColumn = operandTVC3.getColumn();

        _referenceTableViewer.setContentProvider(new ReferenceTableContentProvider());
        _referenceTableViewer.setLabelProvider(new ReferenceTableLabelProvider());

        container.listeners();
    }

    /**
     * Располагаем элементы в определённом порядке
     */
    private void layouts() {
        FormData data;

        data = new FormData();
        data.left = new FormAttachment(0, 0);
        data.top = new FormAttachment(0, 0);
        data.right = new FormAttachment(100, 0);
        data.bottom = new FormAttachment(100, 0);
        _composite.setLayout(new FormLayout());
        _composite.setLayoutData(data);

        //Label - метка
        data = new FormData();
        data.top = new FormAttachment(0, 0); // Attach to top
        data.right = new FormAttachment(100, 0);
        data.left = new FormAttachment(0, 0); // Attach halfway across
        data.height = 20;
        _label.setLayoutData(data);

        //Table - таблица
        data = new FormData();
        data.top = new FormAttachment(_label, 0); // Attach to top
        data.right = new FormAttachment(100, 0);
        data.bottom = new FormAttachment(100, 0); // Attach to bottom
        data.left = new FormAttachment(0, 0); // Attach halfway across
        container.getComposite().setLayoutData(data);
    }

    private void listeners() {

    }

    @Override
    public void setLayoutData(Object layoutData) {
        _composite.setLayoutData(layoutData);
    }

    @Override
    public void show() {
        layouts();
    }

    @Override
    public Composite getComposite() {
        return _composite;  //this method do nothing
    }

    @Override
    public void setController(Object controller) {
        listeners();
    }

    @Override
    public void setInput(final List<String[]> input) {
        _composite.getDisplay().asyncExec(new Runnable() {
            @Override
            public void run() {
                _referenceTableViewer.setInput(input);
                _referenceTableViewer.refresh();
            }
        });
    }

}
